package com.example.live.demos.web;

import com.alibaba.fastjson.JSON;
import com.example.live.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

/*
 * 操作SRS流媒体服务回调函数
 * 该类所有方法返回值均为int类型,根据SRS回调返回值要求
 * 含义：0成功，非0失败
 * */

@Controller
public class SRSCallBackController {
    private Logger log = LoggerFactory.getLogger(this.getClass());

    @ResponseBody
    @RequestMapping("/connect")
    /*
     * 客户端连接SRS服务器时回调函数请求此接口
     *返回0表示校验成功，非0为失败
     * */
    public int on_connect(@RequestBody CallBackDataOnConnect data) {
        log.info("on_connect:"+JSON.toJSONString(data));
//        int code = 1;
//        if (data.getApp() != "" && data.getApp() != null && !data.getApp().isEmpty() && "live".equals(data.getApp())) {
//            code = 0;
//            log.info("推流应用名称正确...客户端连接成功...");
//            return code;
//        } else {
//            log.info("推流应用名称错误...客户端连接失败...");
//            return code;
//        }
        return 0;
    }

    @ResponseBody
    @RequestMapping("/ondvr")
    public int on_dvr(@RequestBody CallBackDataOnDvr data) {
        log.info("收到录制文件数据：" + JSON.toJSONString(data));
        return 0;
    }


    @ResponseBody
    @RequestMapping("/close")
    /*
     * 客户端断开连接时触发
     * 客户端断开包括客户端主动断开和客户端被动断开（服务器主动停止客户端推流断开）
     * */
    public int on_close(@RequestBody String data) {
        log.info("客户端断开连接" + data);
        return 0;
    }

    @ResponseBody
    @RequestMapping("/publish")
    /*
     * 用户推流(即直播)时触发
     * 返回0允许推流，返回非0拒绝推流
     * */
    public int on_publish(@RequestBody CallBackDataOnPublish data) {
//        int code = 1;
//        if(data.getApp()!=""&&data.getApp()!=null&&!data.getApp().isEmpty()&&"live".equals(data.getApp())){
//            //携带url验证格式为?token=....携带参数应为大于7个字符且问号在第一位
//            if (data.getParam().length()>7&&data.getParam().indexOf("?")==0){
//                Boolean flag = false;
//                //截取？后面5个字符判断是否为token
//                String str = data.getParam().substring(data.getParam().indexOf("?")+1,6);
//                if("token".equals(str)){
//                    //截取=后面字符串校验token是否有效
//                    String token = data.getParam().substring(data.getParam().indexOf("=")+1,data.getParam().length());
//                    flag = TokenUtils.verify(token,"jx");
//                    if(flag){
//                        code = 0;
//                        String username = TokenUtils.getUsername(token);
//                        log.info("token验证成功...客户端开始推流...,用户名为："+username);
//                        return  code;
//                    }else {
//                        log.info("token验证失败...禁止客户端推流...");
//                        return code;
//                    }
//                }else {
//                    log.info("请求未携带token...禁止客户端推流");
//                    return code;
//                }
//            }else {
//                log.info("请求未携带token...禁止客户端推流");
//                return code;
//            }
//        }else {
//            log.info("推流应用名称错误...禁止客户端推流");
//            return code;
//        }
        log.info("on_publish:"+JSON.toJSONString(data));
        return 0;
    }

    @ResponseBody
    @RequestMapping("/unpublish")
    /*
     * 客户端停止推流时触发
     * 包括客户端主动停止推流和客户端被动停止推流（服务器主动停止客户端推流）
     * */
    public int on_unpublish(@RequestBody String data) {
        log.info("客户端停止推流" + data);
        return 0;
    }

    @ResponseBody
    @RequestMapping("/play")
    /*
     * 客户端拉流（播放）时触发
     * 0表示允许拉流，非0表示拒绝拉流
     *
     * */
    public int on_play(@RequestBody CallBackDataOnPlay data) {
//        int code = 1;
//
//        if (data.getApp() != "" && data.getApp() != null && !data.getApp().isEmpty() && "live".equals(data.getApp())) {
//            //携带url验证格式为?token=....携带参数应为大于7个字符且问号在第一位
//            if (data.getParam().length() > 7 && data.getParam().indexOf("?") == 0) {
//                //截取？后面5个字符判断是否为token
//                String str = data.getParam().substring(data.getParam().indexOf("?") + 1, 6);
//                if ("token".equals(str)) {
//                    Boolean flag = false;
//                    //截取=后面字符串校验token是否有效
//                    String token = data.getParam().substring(data.getParam().indexOf("=") + 1, data.getParam().length());
//                    flag = TokenUtils.verify(token, "jx");
//                    if (flag) {
//                        code = 0;
//                        String username = TokenUtils.getUsername(token);
//                        log.info("token验证成功...客户端开始播放...,用户名为：" + username);
//                        return code;
//                    } else {
//                        log.info("token验证失败...禁止客户端播放...");
//                        return code;
//                    }
//                } else {
//                    log.info("请求未携带token...禁止客户端播放");
//                    return code;
//                }
//            } else {
//                log.info("请求未携带token...禁止客户端播放");
//                return code;
//            }
//
//        } else {
//            log.info("推流应用名称错误...禁止客户端播放");
//            return code;
//        }
        log.info("on_play:"+JSON.toJSONString(data));
        return 0;
    }

    @ResponseBody
    @RequestMapping("/stop")
    /*
     * 客户端停止播放时触发
     * 官方介绍客户端停止播放时触发，可再次播放，实际通过PC端和移动端谷歌/火狐浏览器（webRTC协议拉流仅支持这俩浏览器）测试貌似仅服务器主动踢流时会触发此回调，
     * 客户端端主动暂停后可再播放，不会触发此回调，客户端关闭窗口会触发此回调
     * */
    public int on_stop(@RequestBody String data) {
        log.info("客户端停止播放" + data);
        return 0;
    }
}
